import { isDef, clamp, extend, createNamespace } from "../utils/index.mjs";
const [name, bem, t] = createNamespace("picker");
// 获取第一个可选数据项或第一列数据
const getFirstEnabledOption = (options) => options.find((option) => !option.disabled) || options[0];
// 数据类型
// 单列数据
// columns:[{text: '周一', value: 'name', children:[]}, {text: '周一', value: 'name', children:[]}]
// 多列数据
// columns:[
  // [{text: '周一', value: 'name'}, {text: '周一', value: 'name' }],
  // [{text: '周一', value: 'name'}, {text: '周一', value: 'name' }]
// ]

// 级联选择器数据类型
// const columns = [
//   {
//     cityName: '浙江',
//     cities: [
//       {
//         cityName: '杭州',
//         cities: [{ cityName: '西湖区' }, { cityName: '余杭区' }],
//       },
//       {
//         cityName: '温州',
//         cities: [{ cityName: '鹿城区' }, { cityName: '瓯海区' }],
//       },
//     ],
//   }
// ]

// 判断picker的类型, multiple cascade default
function getColumnsType(columns, fields) {
  const firstColumn = columns[0];
  if (firstColumn) {
    // 二维数组 多选
    if (Array.isArray(firstColumn)) {
      return "multiple";
    }
    // 包含children字段  级联选择
    if (fields.children in firstColumn) {
      return "cascade";
    }
  }
  return "default";
}
// 修正选中值Index范围  option数据 value选择值
function findIndexOfEnabledOption(options, index) {
  // 修正数据范围
  index = clamp(index, 0, options.length);
  // 向前偏正
  for (let i = index; i < options.length; i++) {
    if (!options[i].disabled)
      return i;
  }
  // 向后偏正
  for (let i = index - 1; i >= 0; i--) {
    if (!options[i].disabled)
      return i;
  }
  return 0;
}
//  选型值 在数据中是否存在
const isOptionExist = (options, value, fields) => value !== void 0 && !!options.find((option) => option[fields.value] === value);

// 通过value获取下级数据 options数据, value选择值, fields数据配置字段
// 返回object对象本身
function findOptionByValue(options, value, fields) {
  const index = options.findIndex((option) => option[fields.value] === value);
  // 修正可选择
  const enabledIndex = findIndexOfEnabledOption(options, index);
  return options[enabledIndex];
}

// 获取级联选择是各列的数据  columns数据源, value选择值, selectedValues当前选中的数据
function formatCascadeColumns(columns, fields, selectedValues) {
  // 级联选择时各列的数据
  const formatted = [];
  // 首次时数据设置为这种结构, 后面遍历取到选中项 也是这种结构 {text: '周一', value: 'name', children:[]}
  let cursor = {
    [fields.children]: columns
  };
  let columnIndex = 0;
  while (cursor && cursor[fields.children]) {
    // 级联各列的数据
    const options = cursor[fields.children];
    // 当前列选中值
    const value = selectedValues.value[columnIndex];
    cursor = isDef(value) ? findOptionByValue(options, value, fields) : void 0;
    // 都不可编辑时取默认第一个数据
    if (!cursor && options.length) {
      const firstValue = getFirstEnabledOption(options)[fields.value];
      cursor = findOptionByValue(options, firstValue, fields);
    }
    columnIndex++;
    formatted.push(options);
  }
  return formatted;
}
// translae3d(0px, -100px, 0px)
// transform "matrix(1, 0, 0, 1, 0, -110)" 只有Y轴移动时
// 获取translateY
function getElementTranslateY(element) {
  const { transform } = window.getComputedStyle(element);
  const translateY = transform.slice(7, transform.length - 1).split(", ")[5];
  return Number(translateY);
}
// 获取数据结构绑定字段
function assignDefaultFields(fields) {
  return extend(
    {
      text: "text",
      value: "value",
      children: "children"
    },
    fields
  );
}
export {
  assignDefaultFields,
  bem,
  findIndexOfEnabledOption,
  findOptionByValue,
  formatCascadeColumns,
  getColumnsType,
  getElementTranslateY,
  getFirstEnabledOption,
  isOptionExist,
  name,
  t
};
